package jdx_05_synchronized.jdx_01_上锁的方式;

public class LockTheWay {
    private final Object object = new Object();
    private int count = 10;

    //[1].第一种加锁的方式
    public void m1 (){
        synchronized (object){ //任何线程需要执行这个方法,必须先拿到object的锁
            count--;
            System.out.println(Thread.currentThread().getName()+"\tcount="+count);
        }
    }

    //[2].第二种加锁方式:如果每次加锁都需要自己 new Object 还不如直接简单一点，给this加锁:
    public void m2(){
        synchronized (this){
            //...
        }
    }

    //[3].第三种加锁的方式:和第二种原理是一样的，其实就是直接在 this 上加锁
    public synchronized void m3(){
        //...
    }

    //[4].此外，如果当前的方法是一个静态的方法，实际上调用的时候，并没有 this 对象，而是等价于给 T1.class 加锁
    public synchronized static void m4(){
        //...
    }

    //[5].对于[4]还有一个问题
    public static void m5(){
        synchronized (LockTheWay.class){ //这里是可以用 this 吗?(不可以,会报错)
            //...
        }
    }
}
